package com.cskaoyan.javase.oop2._1extends._4advantage;

/**
 * 这里给出一个继承语法的练习案例，通过案例我们来分析一下继承的优缺点：
 * 练习：
 * 在一款游戏中，我们设计了三种类型的鸭子，这些鸭子有一些共同的属性，也有共同的行为，比如都可以叫，都会游泳等。
 * 编写程序，描述这些鸭子。
 * 后来，需求更改了，这些鸭子不能游泳了，但是都会飞，怎么改呢？
 * 再后来，需求又改了，新增了一种鸭子，但这个鸭子不会飞，又怎么办呢？
 *
 * 继承的优点:
 *      1.继承的出现减少了代码冗余，提高了代码的复用性。
 *      2.继承的出现，更有利于功能的扩展，提升了程序的可维护性，更好地应对需求变更。
 * 扩展一点：
 *      继承的出现，对于Java的引用类型而言，弱化了类型的约束力，引用数据类型出现了数据类型转换的概念。
 *      这其实是Java实现面向对象第三个特征——多态的前提。
 *
 * 继承的缺点:
 *      子类必须无条件的接收父类的成员
 *      子类是没得选择的
 *
 * 扩展:
 *      Java存在方法覆盖/方法重写(override)的概念
 *      子类在继承父类成员方法的基础上
 *      可以修改实现,不使用父类实现
 *
 *
 * @since 11:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        FirstTypeDuck ftd = new FirstTypeDuck();
        // ftd.swim();
        ftd.fly();

        ThirdTypeDuck ttd = new ThirdTypeDuck();
        // ttd.swim();
        ftd.fly();

        ForthTypeDuck fd = new ForthTypeDuck();
        fd.fly();
    }
}

// 父类
class DuckFather {
    String name;

    public void shout() {
        System.out.println("嘎嘎嘎~~");
    }

    /*public void swim() {
        System.out.println("遨游在知识的海洋~~");
    }*/
    public void fly() {
        System.out.println("鸭子在天上飞,那是因为你在地上吹~~");
    }
}

class FirstTypeDuck extends DuckFather {
    public void sing() {
        System.out.println("唱");
    }
}

class SecondTypeDuck extends DuckFather {
    public void jump() {
        System.out.println("跳");
    }
}

class ThirdTypeDuck extends DuckFather {
    public void rap() {
        System.out.println("rap");
    }
}

class ForthTypeDuck extends DuckFather {
    public void playBasketball() {
        System.out.println("打篮球~");
    }

    // 方法的重写
    @Override
    public void fly() {
        System.out.println("产品经理说我不会飞,那我就不会吧~~");
    }
}